/*
 * @Author: taiyunhang
 * @Date: 2018-12-14 11:24:28
 * */

/**
 * 拦截器的配置
 */
import axios from 'axios';
import qs from 'qs';
import proxyPath from '@/env';
import router from '../routes';
import store from '@/store';
import { Toast } from 'mint-ui';

// 创建实例时设置配置的默认值
const service = axios.create({
  baseURL: proxyPath,
  /* headers: {
    'Content-Type': 'application/json; charset=UTF-8'
  }, */
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  },
  responseType: 'json',
  timeout: 1000 * 60, // 请求超时的时间
  // 对响应的数据进行处理
  transformResponse: [
    function(data) {
      console.log(data);
      return data;
      // return JSON.parse(data);
    }
  ],
  // 对请求的数据进行处理
  transformRequest: [
    function(data) {
      data && (data.sourceType = sessionStorage.sourceType);
      console.log(data);
      return qs.stringify(data);
      // return JSON.stringify(data);
    }
  ]
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 请求前的回调函数
    if (store.state.token) {
      config.headers['access_token'] = store.state.token;
    }
    store.dispatch('openLoading');
    return config;
  },
  err => {
    setTimeout(() => {
      store.dispatch('closeLoading');
    }, 50);
    Toast({ message: '加载超时', position: 'bottom' });
    return Promise.reject(err);
  }
);

// 响应拦截器
service.interceptors.response.use(
  res => {
    if (res) {
      console.log(res);
      let data = res.data;
      // 非登录 -- 路由重定向
      if (data && data.resultCode && data.resultCode !== 'SUCCESS') {
        setTimeout(() => {
          store.dispatch('closeLoading');
        }, 50);
        if (data.resultCode === '0009') {
          store.dispatch('logout');
          router.push({ path: '/login' });
        }
        Toast({ message: data.resultDesc, position: 'bottom' });
        throw Error(data.resultDesc);
      }
    }
    return res;
  },
  err => {
    console.log(err);
    setTimeout(() => {
      store.dispatch('closeLoading');
    }, 50);
    if (err.response) {
      switch (err.response.status) {
        case 401:
          // 返回 401 清除token信息并跳转到登录页面
          store.dispatch('logout');
          router.replace({
            path: 'login',
            query: { redirect: router.currentRoute.fullPath }
          });
      }
    }
    Toast({ message: '服务器有事离开一下，马上就回来', position: 'bottom' });
    return Promise.reject(err);
  }
);

export default service;
